#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <error.h>
#include <unistd.h>
#include <string.h>

using namespace std;

#define BUFFERSIZE 256

/*
    命令行参数
    argc:表示命令行参数的个数
    argv[]:表示命令行参数的字段
*/

int main(int argc, char *argv[])
{

    /* 检查命令行参数的个数 */
    if(argc != 3)
    {
        cout << "arguement cnt error." << endl;
    }
    int srcfd;
    int dstfd;

    const char * srcFile = argv[1];
    const char * dstFile = argv[2];

    if((srcfd = open(srcFile,  O_RDONLY)) == -1)
    {
        /* 打印错误原因 */
        perror("file open error");
        exit(-1);
    }

    /* 权限 */
    /* access函数只能够判断文件是否包含某种权限，但是并不够深入用户组内判断是谁拥有权限，必须开root权限执行代码 */
    int permission = 0;
    access(srcFile, R_OK) == 0 ? (permission |= R_OK) : permission;     
    //access(srcFile, R_OK) == 0 检查 srcFile 是否可读。如果可读，R_OK 的值就会通过按位“或”运算与 permission 结合，从而更新 permission 的值，表示现在有了读取权限。
    access(srcFile, W_OK) == 0 ? (permission |= W_OK) : permission;
    access(srcFile, X_OK) == 0 ? (permission |= X_OK) : permission;

    /* 打开目标文件 */
    if((dstfd = open(dstFile, O_CREAT | O_WRONLY, 0644)) == -1)
    {
        /* 打印错误原因 */
        perror("file open error");
        exit(-1);
    }
    
    char buffer[BUFFERSIZE + 1] = {0};
    int readBytes  = 0;    //判断文件有没有读完
    //放while1外面，防止频繁开辟栈空间影响性能
    while(1)
    {
        readBytes = read(srcfd, buffer, BUFFERSIZE);
        if(readBytes < BUFFERSIZE)
        {
            write(dstfd, buffer, readBytes); 
            break;
        }
        else
        {
            write(dstfd, buffer, readBytes);        //读到多少写入多少
        }
        //清空缓冲区防止脏数据
        memset(buffer, 0, sizeof(buffer));
    }
     

    close(srcfd);
    close(dstfd);


    return 0;
}